ARP 与 MAC 地址:能上网,却不能互访

一个说不通的实验结果

两台电脑挂在同一个交换机下,互相能 ping 通。把其中一台的 IP 从 192.168.1.20 改成 192.168.2.20,掩码两边都是 255.255.255.0。网线没动,交换机没动。

结果:两台互相 ping 不通了,但两台都还能正常上网。

如果只知道“IP 就是机器的门牌号”,这件事没法解释。要解释它,得先认识 ARP。

MAC 地址是什么

每块网卡出厂时烧了一个 48 位地址,写成 12 个十六进制字符,比如 aa:bb:cc:00:11:22。它分两半:

  • 前 24 位是 OUI(厂商标识)。同厂网卡前缀相同,靠它可以大致判断设备品牌。
  • 后 24 位由厂商自行分配,约 1677 万种组合。

它需要保证唯一性的范围其实很小:同一个广播域内不重复就够了。跨网段之后,MAC 会被路由器整个换掉。

这也解释了一个细节:虚拟机和容器的 MAC 是软件生成的,偶尔会撞。两个容器配了同一个 MAC,又在同一个二层网络里,就会互相抢流量。

ARP 解决的问题

IP 包要交给网卡发出去,可以太网帧头要填的是目的 MAC,不是目的 IP。手里只有一个 IP 地址怎么办?

ARP 只干一件事:已知 IP,求对应的 MAC。

  1. 发一个广播帧,目的 MAC 全是 ff:ff:ff:ff:ff:ff,内容是“谁是 192.168.1.5?告诉 192.168.1.2”。
  2. 广播域内所有设备都收到,只有 IP 匹配那台回应,单播回自己的 MAC。
  3. 结果写进 ARP 缓存表,下次直接用。

缓存有老化时间:Windows 一般几十秒,Linux 默认几十秒到几分钟(随内核版本变化)。过期了要重新问一次。

最关键的一句话

跨网段通信时,ARP 解析的是网关的 MAC,不是目的主机的 MAC。

因为以太网只能把帧送到同一个广播域里的设备,而目标主机在别的网段,发出方根本够不到它,也就无从知道它的 MAC。网关是唯一在同一个广播域里、又愿意把包带出去的设备。

回头看开头那个现象。192.168.1.20 被改成 192.168.2.20(掩码仍是 /24)之后:

  • 它 ping 192.168.1.30:一算不同网段,于是不看 192.168.1.30,转去查网关。
  • 网关还是原来的 192.168.1.1,在它自己的掩码下属于“别的网段”。
  • 但 ARP 广播不管网段,它照旧在同一个二层广播域里发出去,路由器收到了就回了自己的 MAC。所以它上网依然是通的。
  • 反过来 192.168.1.30 ping 它也认为不同网段,把包交给网关;网关只有 192.168.1.0/24 这一个接口,没有回 192.168.2.0/24 的路由,直接丢掉。
  • 最终现象:能上网,但不能互访。

这个案例说明一件反直觉的事:能上网不代表内网配置对。上网只验证了“能到网关”,完全不验证“掩码与邻居一致”。

ARP 表长什么样

Windows:

C:> arp -a
接口: 192.168.1.2 --- 0x5
  Internet 地址       物理地址              类型
  192.168.1.1         aa-bb-cc-00-11-22     动态
  192.168.1.30        aa-bb-cc-00-33-44     动态

Linux:

$ ip neigh
192.168.1.1  dev eth0 lladdr aa:bb:cc:00:11:22 REACHABLE
192.168.1.30 dev eth0 lladdr aa:bb:cc:00:33:44 STALE

STALE 不代表不可用,只是说“这个条目超过一定时间没确认,下次通信时先验证一下”。真正的故障状态是 FAILED 或 INCOMPLETE,那表示 ARP 请求没人应答。

ARP 相关的典型故障

1. IP 冲突

两台机器配了同一个 IP。表现是网络时通时断、ARP 表里同一个 IP 的 MAC 来回跳。查法:连续执行几次 arp -a,看同一个 IP 的 MAC 是否变化。根治办法是统一走 DHCP,别手工配。

2. ARP 欺骗

攻击者持续发送伪造的 ARP 应答,把网关 IP 对应到自己的 MAC。之后所有人的流量都从它那儿过。很多“网吧或宿舍突然断网、网页被插广告”就是这套原理。防护靠交换机端口安全(MAC-IP 静态绑定)、DHCP Snooping、动态 ARP 检测。

3. 静态 ARP 绑定

双向绑定(主机绑网关、网关绑主机)能防欺骗,但换网卡或换 IP 之后会变得极难排查。生产环境慎用,一定要记录在案。

4. VLAN 隔离下的 ARP 不通

两台机器在同一个 IP 网段,却被划进了不同 VLAN。它们会互相发 ARP 广播,但广播被隔离了,永远收不到回应。现象和“IP 配错”一模一样,只能靠交换机配置去查。

交换机侧:MAC 表从哪来

交换机靠“源 MAC 学习”建立 MAC 表:收到帧时记下源 MAC 和入口端口,不需要预先配置。反过来,如果某个端口上短时间内出现大量不同源 MAC,通常意味着那儿接了一台非管理型交换机,或者有人在搞 ARP 欺骗。

小结

IP 是逻辑地址,用于跨网段寻址;MAC 是物理地址,只在同一个广播域内有效。ARP 是两者之间的桥,而跨网段时这座桥只搭到网关为止。记住这一点,“配了 IP 还是不通”就能拆成三问:同不同网段?网关对不对?ARP 通不通?

算是否同网段别手算,用 IPv4 子网计算器 更稳。想先弄清交换机与路由器各自的分工,回到 交换机与路由器 那篇。

相关:DHCP 是怎么分到 IP 的——在问「这个地址是谁的」之前,得先有个地址。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容